package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;

public class CreerAlbum {

	Shell shell = null;
	private Display display = null;
	private Text titre;
	private Text soustitre;
	private Button Stats,SeConnecter,btnOui,btnNon,creeralb;
	private Label Nom,infos;
	private Table table;
	private TableColumn tblclmnTitre;
	private TableColumn tblclmnCommentaire;
	
	private Connection conn;
	private List<Integer> idPhoto = new ArrayList<Integer>();
	
	/**
	 * Constructeur
	 * @param d
	 */
	public CreerAlbum(){
		display = MainApp.display;
	}
	
	/**
	 * Dit si la fenêtre est active ou pas
	 */
	public void setActive(){
		if(shell == null || shell.isDisposed()){
			run();
		}else{
			rafraichir();
			shell.setActive();
		}
	}
	
	/**
	 * Génère l'affichage à l'ouverture de l'application
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){

		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE);		// Crée une fenêtre non redimensionnable
		shell.setText("Créer un Album");
		shell.setSize(702, 475);
		shell.setImage(MainApp.icone);
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		
		Label lblSaisissezUnTitre = new Label(shell, SWT.NONE);
		lblSaisissezUnTitre.setAlignment(SWT.RIGHT);
		lblSaisissezUnTitre.setBounds(10, 63, 241, 20);
		lblSaisissezUnTitre.setText("Saisissez un titre pour votre Album :");
		
		titre = new Text(shell, SWT.BORDER);
		titre.setBounds(257, 57, 427, 26);
		
		Label lblSaisissezUnSoustitre = new Label(shell, SWT.NONE);
		lblSaisissezUnSoustitre.setAlignment(SWT.RIGHT);
		lblSaisissezUnSoustitre.setBounds(10, 113, 241, 20);
		lblSaisissezUnSoustitre.setText("Saisissez un sous-titre pour votre Album :");
		
		soustitre = new Text(shell, SWT.BORDER);
		soustitre.setBounds(257, 107, 427, 26);
		
		Label lblSouhaitezVousLe = new Label(shell, SWT.NONE);
		lblSouhaitezVousLe.setAlignment(SWT.RIGHT);
		lblSouhaitezVousLe.setBounds(85, 142, 166, 20);
		lblSouhaitezVousLe.setText("Souhaitez Vous le partager ?");
		
		btnOui = new Button(shell, SWT.RADIO);
		btnOui.setBounds(257, 139, 59, 20);
		btnOui.setText("Oui");
		
		btnNon = new Button(shell, SWT.RADIO);
		btnNon.setBounds(257, 161, 59, 20);
		btnNon.setText("Non");
		
		creeralb = new Button(shell, SWT.NONE);
		creeralb.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				if (MainApp.idClient!=0){
					try {
						CreationAlbum();
						shell.dispose();
					} catch (SQLException e) {
						try {
							if(conn != null){
								conn.rollback();
								conn.close();
							}
						} catch (SQLException e1) {
							MainApp.erreurBase(e1.getMessage());
						}
						
						infos.setText("Une erreur est survenue !");
						MainApp.erreurBase(e.getMessage());
					}
				}else{
					creeralb.setEnabled(false);
				}
			}
		});
		creeralb.setBounds(511, 139, 173, 42);
		creeralb.setText("Créer l'Album");
		creeralb.setEnabled(false);
		
		Label label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
		label.setBounds(0, 34, 696, 20);
		
		SeConnecter = new Button(shell, SWT.NONE);
		SeConnecter.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				actionBouttonConnexion();
			}
		});
		SeConnecter.setBounds(587, 10, 97, 25);
		SeConnecter.setText("Se connecter");
		
		Button Retour = new Button(shell, SWT.NONE);
		Retour.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				shell.dispose();
				MainApp.consult.setActive();
			}
		});
		Retour.setBounds(10, 10, 179, 25);
		Retour.setText("Retour à la Consultation");
		
		Stats = new Button(shell, SWT.NONE);
		Stats.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.stats.setActive();
			}
		});
		Stats.setBounds(195, 10, 166, 25);
		Stats.setText("Afficher les Statistiques");
		Stats.setVisible(false);
		
		Nom = new Label(shell, SWT.NONE);
		Nom.setAlignment(SWT.RIGHT);
		Nom.setBounds(367, 15, 214, 20);
		
		infos = new Label(shell, SWT.NONE);
		infos.setAlignment(SWT.RIGHT);
		infos.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
		infos.setBounds(437, 187, 249, 20);
		infos.setVisible(false);
		
		table = new Table(shell, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
		table.setBounds(10, 208, 674, 225);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		TableColumn tblclmnCheminVersLa = new TableColumn(table, SWT.NONE);
		tblclmnCheminVersLa.setWidth(335);
		tblclmnCheminVersLa.setText("Chemin vers la photo");
		
		tblclmnTitre = new TableColumn(table, SWT.NONE);
		tblclmnTitre.setWidth(120);
		tblclmnTitre.setText("Titre");
		
		tblclmnCommentaire = new TableColumn(table, SWT.NONE);
		tblclmnCommentaire.setWidth(200);
		tblclmnCommentaire.setText("Commentaire");
		
		Button btnAjouterUnePhoto = new Button(shell, SWT.NONE);
		btnAjouterUnePhoto.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				InputBox message = new InputBox();
				message.open();
				
				if (message.getChemin().trim() != "") {
					TableItem item = new TableItem(table, SWT.NONE);
					item.setText(new String[] {message.getChemin().trim().replace('\'', '_'), message.getTitre().trim().replace('\'', '_'), message.getComm().trim().replace('\'', '_')});
					item.setChecked(true);
					idPhoto.add(message.getIdPhoto());
				}
			}
		});
		btnAjouterUnePhoto.setBounds(10, 178, 109, 25);
		btnAjouterUnePhoto.setText("Ajouter une photo");
		

		rafraichir();
		shell.open();
	}
	
	/**
	 * Cette fonction défini l'action à exécuter lorsque
	 * l'on clique sur le boutton de connexion :
	 * - soit on se connecte
	 * - soit on se déconnecte
	 */
	public void actionBouttonConnexion(){
		if(MainApp.idClient == 0){
			MainApp.conn.setActive();
		}else{
			MainApp.conn.deconnecter();
		}
	}
	
	/**
	 * Met à jour l'affichage
	 */
	public void rafraichir(){
		titre.setText("");
		soustitre.setText("");
		btnOui.setSelection(false);
		btnNon.setSelection(true);
		
		idPhoto.removeAll(idPhoto);

		table.removeAll();
		
		if(MainApp.estAdmin)
			Stats.setVisible(true);
		else
			Stats.setVisible(false);
		if(MainApp.idClient != 0){
			SeConnecter.setText("Déconnexion");
			Nom.setText(MainApp.prenom + " " + MainApp.nom);
			creeralb.setEnabled(true);
		}else {
			SeConnecter.setText("Se connecter");
			Nom.setText("Vous n'êtes pas connecté");
			creeralb.setEnabled(false);
		}
			
	}
	
	/**
	 * Crée un album
	 * @throws SQLException
	 */
	public void CreationAlbum() throws SQLException{
		if (titre.getText()==""){
			infos.setText("Saisissez toutes les informations SVP");
			infos.setVisible(true);
			return;
		}
		if (!btnOui.getSelection() && !btnNon.getSelection()){
			infos.setText("Saisissez toutes les informations SVP");
			infos.setVisible(true);
			return;
		}
		
		infos.setVisible(false);

		conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		Statement stmt = conn.createStatement();
		
		if (btnOui.getSelection()){
			stmt.executeUpdate("INSERT INTO Album (titre, sousTitre, partage, idClient) VALUES ('"+titre.getText().trim().replace('\'', '_')+"', '"+soustitre.getText().trim().replace('\'', '_')+"', 'o',"+MainApp.idClient+")");			
		}else{
			stmt.executeUpdate("INSERT INTO Album (titre, sousTitre, partage, idClient) VALUES ('"+titre.getText().trim().replace('\'', '_')+"', '"+soustitre.getText().trim().replace('\'', '_')+"', 'n',"+MainApp.idClient+")");
		}
		
		// Récupération de l'identifiant
		int noAlbum = -1;
		ResultSet rset = stmt.executeQuery("SELECT SAlbum.currval FROM dual");
		if (rset.next()) {
			noAlbum = rset.getInt(1);
		}
		
		// Insertion des photos
		int place = 0;
		for (int i = 0 ; i < table.getItemCount() ; i++) {
			if (table.getItem(i).getChecked()) {
				// Ajoute la photo si elle n'existe pas en base
				int noPhoto;
				if (idPhoto.get(i) < 0) {
					stmt.executeUpdate("INSERT INTO Photo (chemin) VALUES ('" + table.getItem(i).getText(0).trim().replace('\'', '_') + "')");
		
					// Récupération de l'identifiant
					noPhoto = -1;
					rset = stmt.executeQuery("SELECT SPhoto.currval FROM dual");
					if (rset.next()) {
						noPhoto = rset.getInt(1);
					}
				} else {
					noPhoto = idPhoto.get(i);
				}
				
				// Crée le lien entre la photo et l'album
				stmt.executeUpdate("INSERT INTO Contient (idAlbum, idPhoto, numPlace, titre, commentaire)" +
						" VALUES (" +
							String.valueOf(noAlbum) + ", " +
							String.valueOf(noPhoto) + ", " +
							String.valueOf(place) + ", '" +
							table.getItem(i).getText(1).trim().replace('\'', '_') + "', '" +
							table.getItem(i).getText(2).trim().replace('\'', '_') +
						"')");
				
				place++;
			}
		}

		rset.close();
		stmt.close();
		conn.commit();
		conn.close();	
		MainApp.rafraichir();
		
	}
	
	/**
	 * Permet de savoir si la fenête est ouverte ou non
	 * @return
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
	
}
